home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / enigma / earcd / musicali / splib52d.lha / superplay-lib_DEV / Programmers / Oberon-2 / Example_Tools / SimplePlay.mod < prev    next >
Text File  |  1996-11-15  |  9KB  |  316 lines

  1. (********************************************************************
  2.  
  3. :Program.     SimplePlay.mod
  4. :Contents.    SPObject operations:
  5. :Contents.      - Play Samples/Modules (all SPObjects)
  6. :Contents.    Use it as an example for programming superview.library!
  7. :Copyright.   (c) 1994 by Andreas Ralph Kleinert.
  8. :Copyright.   Freeware. All rights reserved.
  9. :Language.    Oberon-2
  10. :Translator.  A+L Amiga Oberon Compiler V3.11d
  11. :History.     V1.5 indy 27-Dec-95 first Oberon-2 version
  12. :Imports.     SuperPlay.mod
  13. *********************************************************************)
  14.  
  15. MODULE SimplePlay;
  16.  
  17. IMPORT
  18.   Break,
  19.  
  20.    asl:= ASL,
  21.      d:= Dos,
  22.      e:= Exec,
  23.     es:= ExecSupport,
  24.      g:= Graphics,
  25.      i:= Intuition,
  26.      u:= Utility,
  27.  
  28.   args:= Arguments,
  29.     io,
  30.     ol:= OberonLib,
  31.    str:= Strings,
  32.      s:= SYSTEM,
  33.  
  34.     sp:= SuperPlay;
  35.  
  36.  
  37. CONST
  38.  
  39.   (*** Help- and Info- Texts ****)
  40.   VerText       = "$VER: SimplePlay(Oberon-2) 1.5 (27.12.95)";
  41.  
  42.   FileReqText   = "Select Picture File :";
  43.  
  44.   EntryText1 = "\[1;32;40mSimplePlay(Oberon-2) V1.5 \[0;32;40m\[3;32;40m(FREEWARE)\[0;32;40m\n"
  45.                "(c) 1994 by Andreas Ralph Kleinert.\n"
  46.                "Andreas R. Kleinert, Grube Hohe Grethe 23, D-57074 Siegen, Germany.\n";
  47.   EntryText2 = "Plays Sound Samples and Modules via superplay.library.\n";
  48.   EntryText3 = "USAGE : \[0;33;40mSimplePlay\[0;31;40m [? | -STOP | -REMOVE | <Sample/ModuleFileName>]\n";
  49.  
  50.  
  51.   (*** Error-Messages for Leave() and KF_Message()     ***)
  52.  
  53.   IntuitionLibText = 'You need "intuition.library" V37+ !';
  54.   ASLLibText       = 'You need "asl.library" V37+ !';
  55.   SPLibText        = 'You need "superplay.library" V1+ !';
  56.  
  57.  
  58.  
  59. (* *************************************************** *)
  60. (* *                                                 * *)
  61. (* * Variables for Port Usage                        * *)
  62. (* *                                                 * *)
  63. (* *************************************************** *)
  64.  
  65.  
  66. CONST
  67.   PortName  = "SimplePlay.port";
  68.   PortName2 = "SimplePlay_2.port";
  69.  
  70.  
  71. VAR
  72.   port1, port2: e.MsgPortPtr;
  73.  
  74.  
  75. (* *************************************************** *)
  76. (* *                                                 * *)
  77. (* * Structure-Definitions and Flags                 * *)
  78. (* *                                                 * *)
  79. (* *************************************************** *)
  80.  
  81. TYPE
  82.   SPMessagePtr = UNTRACED POINTER TO SPMessage;
  83.  
  84.   SPMessage = STRUCT(msg: e.Message)  (* The Message itself           *)
  85.     flag: LONGSET;     (* (See flag-definitions below) *)
  86.     ext : e.APTR;      (* Future expansions            *)
  87.   END;
  88.  
  89.  
  90. CONST
  91.   spfRemove = LONGSET{1};
  92.   spfStop   = LONGSET{2};
  93.   (* #define SPF_CONT   ((ULONG) 3) *)
  94.  
  95.  
  96. (* *************************************************** *)
  97. (* *                                                 * *)
  98. (* * Globally Accessed Data                          * *)
  99. (* *                                                 * *)
  100. (* *************************************************** *)
  101.  
  102. CONST
  103.   TopazAttr = g.TextAttr (s.ADR("topaz.font"), i.topazEighty, g.normal,
  104.                            SHORTSET{g.romFont});
  105. VAR
  106.   verText    : e.STRING;
  107.  
  108.   argv       : ARRAY 3 OF e.STRING;
  109.   wbLoadname : e.STRING;
  110.   wb         : BOOLEAN;
  111.  
  112.   request    : asl.FileRequesterPtr;
  113.   tags       : ARRAY 4 OF u.TagItem;
  114.   nameBuffer : e.STRING;
  115.  
  116.   ourMsg     : SPMessage;
  117.   msgPtr     : e.MessagePtr;
  118. (*-------------------------------------------------------------------*)
  119.  
  120. PROCEDURE Leave(endText: ARRAY OF CHAR; result1, result2: LONGINT);
  121.  
  122. VAR
  123.   procPtr: d.ProcessPtr;
  124.   dummy  : LONGINT;
  125.  
  126. BEGIN
  127.   procPtr:=s.VAL(d.ProcessPtr, ol.Me);
  128.  
  129.   IF (endText#"") AND (ol.wbStarted=FALSE) THEN
  130.     io.WriteString(endText); io.WriteLn;
  131.   END;
  132.  
  133.   IF d.base.lib.version>=36 THEN dummy:= d.SetIoErr(result2);
  134.                             ELSE procPtr.result2:=result2;
  135.   END;
  136.  
  137.   IF result1= d.ok THEN HALT(d.ok);
  138.   ELSIF result1= d.warn  THEN HALT(d.warn);
  139.   ELSIF result1= d.error THEN HALT(d.error);
  140.   ELSIF result1= d.fail  THEN HALT(d.fail);
  141.   ELSE HALT(d.fail);
  142.   END;
  143. END Leave;
  144.  
  145. (* *************************************************** *
  146.  * *                                                 * *
  147.  * * Remove-Function                                 * *
  148.  * *                                                 * *
  149.  * *************************************************** *)
  150.  
  151. PROCEDURE Remove();
  152.  
  153. VAR
  154.   port   : e.MsgPortPtr;
  155.   gotMsg : SPMessagePtr;
  156.  
  157.  
  158. BEGIN
  159.   port1:= e.FindPort(PortName); (* still there ? *)
  160.   IF port1#NIL THEN (* remove previous song and task, if existant *)
  161.  
  162.     port:= es.CreatePort(PortName2, 0);
  163.     IF port#NIL THEN
  164.       ourMsg.msg.replyPort:= port;
  165.       ourMsg.msg.length   := SIZE(SPMessage);
  166.       ourMsg.flag         := spfRemove;
  167.       ourMsg.ext          := NIL;
  168.  
  169.       port1:= e.FindPort(PortName); (* still there ? *)
  170.       IF port1#NIL THEN
  171.         e.PutMsg(port1, s.ADR(ourMsg));
  172.         e.WaitPort(port);
  173.       END;
  174.  
  175.       gotMsg:= e.GetMsg(port);
  176.       WHILE gotMsg#NIL DO gotMsg:= e.GetMsg(port); END;
  177.       e.RemPort(port);
  178.     END;
  179.   END;
  180. END Remove;
  181. (*-------------------------------------------------------------------*)
  182.  
  183. (* *************************************************** *
  184.  * *                                                 * *
  185.  * * Play-Function                                   * *
  186.  * *                                                 * *
  187.  * *************************************************** *)
  188.  
  189. PROCEDURE Play(filename: ARRAY OF CHAR);
  190.  
  191. VAR
  192.   handle     : e.APTR;
  193.   retVal     : LONGINT;
  194.   ourWaitport: e.MsgPortPtr;
  195.   gotMsg     : e.MessagePtr;
  196.   run        : BOOLEAN;
  197.   flag       : LONGSET;
  198.  
  199. BEGIN
  200.   retVal:= sp.errNoError;
  201.   run:= TRUE;
  202.  
  203.   Remove();
  204.  
  205.   ourWaitport:= es.CreatePort(PortName, 0);
  206.   IF ourWaitport#NIL THEN
  207.  
  208.     handle:= sp.AllocHandle(NIL);
  209.     IF handle#NIL THEN
  210.       retVal:= sp.InitHandleAsDOS(handle, NIL);
  211.  
  212.       IF retVal=0 THEN
  213.         retVal:= sp.SuperPlay(handle, filename);
  214.  
  215.         IF retVal=0 THEN
  216.           WHILE run=TRUE DO
  217.             e.WaitPort(ourWaitport);
  218.             gotMsg:= e.GetMsg(ourWaitport);
  219.             flag:= gotMsg(SPMessagePtr).flag;
  220.  
  221.             IF flag=spfRemove THEN sp.FreeHandle(handle); run:= FALSE; END;
  222.             IF flag=spfStop   THEN sp.StopReplay(handle);              END;
  223.  
  224.             e.ReplyMsg(gotMsg);
  225.           END;
  226.         END;
  227.       END;
  228.     ELSE retVal:= sp.errNoHandle; END;
  229.  
  230.     gotMsg:= e.GetMsg(ourWaitport);
  231.     WHILE gotMsg#NIL DO
  232.       e.ReplyMsg(gotMsg);
  233.       gotMsg:= e.GetMsg(ourWaitport);
  234.     END;
  235.     e.RemPort(ourWaitport);
  236.   END;
  237.  
  238.   IF retVal#0 THEN Leave(sp.GetErrorString(retVal)^, 0, 0); END;
  239. END Play;
  240. (*---------------------------------------------------------*)
  241.  
  242. BEGIN
  243.   verText:= VerText;
  244.   ourMsg.msg.node.type:= e.message;
  245.   port1:= e.FindPort(PortName);
  246.  
  247.   IF args.NumArgs()>=1 THEN args.GetArg(1, argv[1]); END;
  248.   IF args.NumArgs()>=2 THEN args.GetArg(2, argv[2]); END;
  249.  
  250.   IF ol.wbStarted=TRUE THEN
  251.     wb:= TRUE; wbLoadname:= argv[1];
  252.  
  253.   ELSIF (args.NumArgs()>2) OR (argv[1, 0] ="?") OR (argv[2, 0] = "?") THEN
  254.     io.WriteString(EntryText1);
  255.     io.WriteString(EntryText2);
  256.     io.WriteString(EntryText3);
  257.     Leave("", 0, 0);
  258.   END;
  259.  
  260.   IF sp.LibVer(i.base)  <37 THEN Leave(IntuitionLibText,   d.fail, 103); END;
  261.   IF sp.LibVer(asl.base)<37 THEN Leave(ASLLibText,   d.fail, 103); END;
  262.   IF sp.LibVer(sp.base) <1  THEN Leave(SPLibText,    d.fail, 103); END;
  263.  
  264.  
  265.  (* Play *)
  266.  
  267.   IF (args.NumArgs()<1) AND (wbLoadname="") THEN
  268.     tags[0].tag  := asl.hail;
  269.     tags[0].data := s.ADR("Select Sample/Module to play :");
  270.  
  271.     tags[1].tag  := asl.okText;
  272.     tags[1].data := s.ADR(" Play ");
  273.  
  274.     tags[2].tag  := asl.cancelText;
  275.     tags[2].data := s.ADR(" Quit ");
  276.  
  277.     tags[3].tag  := u.done;
  278.     tags[3].data := NIL;
  279.  
  280.     request:= asl.AllocAslRequest(asl.fileRequest, NIL);
  281.     IF request#NIL THEN
  282.       IF asl.AslRequest(request, tags)=TRUE THEN
  283.  
  284.         COPY(request.dir^, nameBuffer);
  285.         IF (nameBuffer[0]# "\o") AND
  286.            (nameBuffer[str.Length(nameBuffer)-1]# ":") AND
  287.            (nameBuffer[str.Length(nameBuffer)-1]# "/") THEN str.Append(nameBuffer, "/");
  288.         END;
  289.  
  290.         str.Append(nameBuffer, request.file^);
  291.         IF nameBuffer#"" THEN Play(nameBuffer); END;
  292.       END;
  293.       asl.FreeAslRequest(request);
  294.     END;
  295.   ELSE
  296.    IF wbLoadname#"" THEN Play(wbLoadname)
  297.      ELSIF argv[1,0]#"-" THEN Play(argv[1]);
  298.      ELSIF argv[1]="-STOP" THEN
  299.        IF port1#NIL THEN
  300.          port2:= es.CreatePort(PortName2, 0);
  301.          ourMsg.msg.replyPort:= port2;
  302.          ourMsg.msg.length   := SIZE(SPMessage);
  303.          ourMsg.flag         := spfStop;
  304.          ourMsg.ext          := NIL;
  305.  
  306.          e.PutMsg(port1, s.ADR(ourMsg));
  307.          e.WaitPort(port2);
  308.          msgPtr:= e.GetMsg(port2);
  309.          e.RemPort(port2);
  310.        END;
  311.      ELSIF argv[1]="-REMOVE" THEN Remove(); END;
  312.   END;
  313.   Leave("", 0, 0);
  314.  
  315. END SimplePlay.
  316.